@L|}6CD l0C)HCC WhL/h `CmCDiD`  R@W1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` D  C D     )16CS S)  C)D1 p p }0 C9DI pCDL~CiCDiD` DD˙` d J)L !}D L(( LL()  L| L( S LH 0p n  } CY?  q  L L  ` )} `A! d߰")-݆ "  $G@LLL&0") $G% }H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0 })8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH) }  hyhyB q L> Lm JJ  Ln*` dB%' }8  H H` 1 { LL   !L     Hh SY?  q  1L }  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF } G) *Gȩ GȽG GȌd q q G`  8   0G  `D}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y}`piH n0)բY? 08`0 }  0$L GGȽG L `8L`L}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR}1LJ舩9GIH`LJJ`HGHh l`} S gL   8 rii `дCDCG W  }C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}} HE |||DDOS DOSDOS SYS }}}}CDOS SYS} 0`BDELV !B }`LVUQ   ]   TU J ]L!T  #      TU  } L ? .  t`GBJ V~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI   0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -'}LLu DEHILV 9 .l 9 .l  `` s$B VBH(}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVL)}1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2e*}1i1232435ޥ<<8}?U (c)1983 Action Computer Services  B JKIHiDiELV`L@,} @ BLV`Ll@h@l Li@ &` Fj`8冨凪` @EӅӥ-} @`ʆǪƩ Ɛee` @ƦʆǢ &Ɛeǐ @ @L@ @'&&&8儨児.}祂*L@&&*ń8&&L@ .A`hihiHHȱȱLv@c !#3`/}Li@JJJJ`H v@h`Hȩh E@LA N@LA ?LA @LA @H80}`HhHh 2BLA BHI V䅠LA LiB @LAԆ ؠPIPP`1} BP @LA BLB BLB BLBH- B8塪墨hLB BLB BLB BȹP`2}텠8堨塪 B芨Oȩ-`PP aBP棩 Ѥģ0-ģ6000:,80H 3}& &ehe&eģ0ʥ 8堅塅`$ B&*i0:0i BƦ`¢ 护4}°ڱ%ȱ%E BL3D担CS %BL3DI BL3DH CL3D BL3D &B V ANLMȑ5}` MLN%B VLAS:DE:DH B DD A Bh)0IDDLA[\ZUVT` EDD6}` ELB ELgB ELB) ` ELB @` 0d i@ҥ `2)27}ҩ`҅`0)9E`@0)ӈJJJJ)`Ѕ`ȱ`` Fȥ`Hh8}ƣĢ`ƥĤ`Ѣ F`ȱѢĦ`膡`9}`ťƤe8夰LF Ƥ8`ŦeѠe桊LF$:};}<}=}((>}(LFIBIBI G`LVIj E8GGGG @GG BLI D:FONT.SE?}TI AQIPIPIQILI gBRILI B`GmPIGmQIRI FPIйQILI B`L JJJ@}ȌJ0JuJL[JJȌJJDJDJJJLPJJJL4JJJLJ`LaJ ELxJ ˠҢJm B J`ULJA}JJJLJ D:DOC.000J mJ*(mJLJ D:DOC.001JȑȈ mJ*(mJLJ D:DOC.002Jȑ򈑮 mB}J*(mJL&K D:DOC.003Kȑ mJ*(mJLPK D:DOC.004KȑF mJ*(mJLzK D:DOC.005Kȑp C}mJ*(mJLK D:DOC.006Kȑ mJ*(mJLK D:DOC.007KȑĈ mJ*(mJLK D:DOC.008Kȑ D}mJ*(mJL"L D:DOC.009Lȑ mJ*(mJLLL D:DOC.010LȑBJ mJ*(mJȱH F`LLE}~L G~L J BH A G`LLHʩ MBH MBLHLLͬLLMLHI L MHLHʢI FIF}H FLMLLLLH)M)MͬLLdMLHI L^MHLHI FIH FLdMLLM`LiM D1H0HG}HiHiGHiHiHi HiHi HieMeMLMHmeMHieMLM`LM H}fMGG .A FL;NN: %B ELTNANTICNN %B ELpNSOFTWARENg %BI} ELN N %B ELN N %B  EH %B  EH %B J}ELO N %B ELOO"Press for Screen, for PrinterO, %B BLaOK:O^ K}A@ gBMMIP MISLrO ELO$ O %B BM`LOOOISLOL}` ELPPRESS FOR CONTINOUS FEEDO %B ELDPPRESS FOR SINGLE SHEETP+ %B BLVPK:PS AM}@ gBOOIS OICLgP ELP P %B ELP N}P %B BO`LPPPP#GICLQPP ELDQàQ' %B BLVQK:QS O}A gBPPILQ BP`PP ELQ Q %B B`LQ ȢG !F$GGP}$GGLQG$ B`Q8GRRQLR8GQQQ$GQQI LRQGGRGRQLbRQmQ$GQGQQ}L6xo~{>>888>|||f<\}c6>8pp8?]}w><~~~<||`x`~<~~<^}0~0 ~ <~~<~~f~``~~f~~~``~~~f~~f~`~~~~f~~``~~ff8888<>>``f||f88<<w_}wk~~fff~~ff~~~f~``~~f~~~```~`~~~~fff~~ff~<ckwf~<~fff~~~~~0~<~~<`}~x|ngTTTTTTfff~~`~~fl0fF>6xo~{>>888>|||f<".These registers have their contents shown i }n hexadecimal notation :PC = Program counter, a 2 byte valueA = AccumulatorX = X index registerY = Y index regist }erS = Stack pointerThe Processor status register (NV BDIZC) is shown in binary form, whereN = Negative flagV = Over }flow flagB = BRK instruction flagD = Decimal mode flagI = Interrupt disable flagZ = Zero flagC = Carry bit------------ }--------------------------------------------DISPLAY WINDOWThe display window forms a window into the system memory addres }s space. This window is located in the upper left hand portion of the display screen, and occupies more than a quarter of the } full screen. The window is set upon entry to EXDDT, and may be moved by several commands.The window may be thought of as h }aving one of two possible filters in front of it. The first filter, which is set upon entry to EXDDT is a disassembly filter. } A GREATER THAN sign (>) points to what is called the current position. When EXDDT is entered, this will correspond to the va }lue in the PC. The current position is modified by several commands.The SECOND filter is a hexadecimal filter. The window s }hows the hexadecimal value and ATASCII representation of up to 48 memory locations. Again, the > sign indicates the current p }osition.The command "W" toggles between these two Window filters.There are always three bytes shown above the current pos }ition. These are shown in hexadecimal form.In the disassembly display, each line from the current position down is shown in } a similar format. First the hexadecimal address of a location, its contents and then a disassembly readout. Standard 6502 mn }emonics are used, with conventional address mode indications.Several features have been added to aid debugging. If a mnemon }ic is shown in inverse video, it indicates that a breakpoint has been set at that location. In fact, if you look at the actua }l contents of that location, it will be a 0. If the mnemonic in inverse video is a BRK instruction, this means that particula }r BRK instruction was not placed there by EXDDT. This would occur for instance in looking at memory that is all zeros.Secon }dly, if the instruction is one of the branch instructions, an additional portion is added to the disassembly display. An up o }r down arrow is used to indicate the direction of the conditional branch. The computed address of the conditional branch loca }tion is also shown.Finally, if the address portion of an instruction contains an address that is defined as a symbol, the s }ymbol name will be shown rather than the hexadecimal value. Such symbols can either be defined by users in the mini-symbol ta }ble, or may be standard system symbols. EXDDT has around 150 standard internal symbols that are defined in the operating syst }em. These symbols make understanding the disassembly display much easier. This is particularly the case if care is taken to p }rogram the system in accordance with original design considerations. Care has been taken to ensure that the standard system s }ymbols defined are ones that are valid for all models of the Atari. There's no real rhyme or reason as to which system variab }les are defined, these are merely the ones I felt to be most important. The mini-symbol feature may be used to monitor a vari }able, locate references to a symbol in the code, or simply as labels to make the disassembly listing more readable. One more }little feature is added as a convenience. If you define a symbol as a two-byte symbol, then any reference to the variable's h }igh byte will show up in the disassembly as SYMBOL+1.If the hexadecimal filter is in place, each line after the current pos }ition line will start on an even 4 byte boundary. This means the current position line can have 1-4 values on it. The current } position line values will always be left justified.--------------------------------------------------------STACK DISPLAY }The middle portion of the upper display screen is used for showing the top locations in the system stack. If the stack poin }ter is set at $E0 or higher (i.e. there are less than 15 entries in the stack), then only those values that are currently in }the stack will be shown. The display is a top down representaion. If more than 15 entries are in the stack, then only the top } 15 are shown.---------------------------------------------------------MINI SYMBOL TABLEThe upper right hand portion o }f the screen is dedicated to a mini symbol table. There is room for 15 variables in this table. This feature is designed to l }et a user monitor the contents of selected variables without having to pay undue attention to where they physically reside. T }he display layout shows the variable name, a V column and a value column. The V column is used to mark variables (see the V f }unction description). The value column will show either the current value of a variable, or its location in memory. Internall }y, each symbol in the table is in the following form: NAME LOCATION BYTES to SHOW symbol symbol 0, 1 or 2 } name address 6 bytes 2 bytes 1 byteUsing the Atari Macro Assembler (AMAC), an example of setting up a min }i symbol table entry would be :DB 'VAR1 ' ; Exactly 6 ; characters please!DW VAR1 ; let the assemb }ler ; figure out what ; value to put hereDB 1 ; either a 0,1 or 2 ; to i }ndicate that ; the variable should ; be shown as no ; bytes, a single } ; byte or a double ; byte value.(Users of other assemblers may need to substitute .BYTE for DB and .WORD for } DW)The mini symbol table can be used to keep an eye on standard system variables.DB 'COLPF2'DW 710DB 1A small are }a of memory can be monitored by setting up several dummy variables each pointing to one or two successive bytes of memory.T }he mini symbol table has other uses also, e.g. you can define a program label as a symbol. By selecting a display size of 0, }no value will be displayed, but the disassembly listing in the display window will be more readable.DB 'LOOP1 'DW LOOP1 }DB 0Indeed you can even define a symbol as "------" or some such to separate different usage areas of the symbol table. Fi }nally, the mini symbol table can be used to help locate a portion of your code after a reassembly. See the 'M' function and s }ymbolic references for more information on this usage.You need not define any more symbols than you want to use. If you set } up less than 15 symbols in a symbol table, a value of $FF should terminate the table.EXDDT comes with a built in mini-sym }bol table that contains some of the variables the operating system uses in controlling the system. You may make individual ch }anges to the standard table with the M command, or you may load in your own table. A symbol table is loaded in a straightforw }ard manner. Create a symbol table in your object code as described earlier. Near the beginning of your code, use a series of }instructions like :LDA # high SYMTABPHALDA # low SYMTABPHAJSR $6000 ; address of the ; symbol table } ; transfer routine ; for this assembled ; version. This is ; always the fir }st ; byte of EXDDT, even ; if it has been ; relocated.----------------------------- }-----------------------------BREAKPOINT TABLEThe Breakpoint table is located just above the register display. There are s }ix user definable breakpoints and two trap breakpoints, each of which will be shown with its current setting. If a register i }s not set the value shown will be 0000. If a breakpoint register is set, the value in that register will be the location of w }here in memory a BRK instruction has been placed. However, in the case of the TRAP breakpoints, no BRK instruction is used. T }hese values are used in interpretive mode to create the equivalent of a break instruction.-------------------------------- }--------------------------COMMAND WINDOWThe extreme right hand part of the bottom of the screen is devoted to the command } window. This is the area that shows the command that a user is typing in.------------------------------------------------ }----------TRAPThe Trap breakpoints are reserved for interpretive mode. In this mode, breakpoints in memory are ignored, s }ince EXDDT already has control of the system. Instead EXDDT checks the values in the TRAP registers. If either equals the add }BREAKPOINTSOne of the most common debugging techniques is to make use of a breakpoint.The breakpoint mechanism is the mos}t common way for you to transfer control to EXDDT. When a program is running, executing a BRK instruction will call EXDDT. Th}is will cause the EXDDT screen display to activate, and also will turn on the keyboard and the push button command interprete}r. The breakpoint will remain set even after it has been encountered in code execution.After a breakpoint has been encounte}red, and control has been transferred to EXDDT, there are several ways to leave EXDDT. The 'N' command will set a breakpoint }at the next location and then continue code execution. START simply continues code execution. 'G' can be used to transfer con}trol to another location.Up to six breakpoints can be in place at any one time. The location of the breakpoints is shown in} the breakpoint register display. If a breakpoint is clear (i.e. not set), it will show up as 0000. Setting a breakpoint regi}ster to a new location will automatically restore an existing breakpoint, if one is already set for that register. Note also }that there is an internal system breakpoint 0 which is used by the 'N' command. If any breakpoint is encountered and control }is transferred to EXDDT, then the internal 'N' breakpoint is cleared.PUSH BUTTONS CONTROLSThe three ATARI console push }buttons are used by EXDDT for special effects.START - is used to continue code execution at the location } indicated by the PC register. All 6502 registers are updated with the current displayed } contents before control is transferred.SELECT - is used to toggle back and forth between the EXDDT } screen and whatever screen dynamics were active before EXDDT was called. An attempt has been m}ade to allow most alternative features such as mixed Display lists, VBLANK routines, alte}rnative character sets, display list interrupts, playfield size changes, and player-missi}les.OPTION - is used to single step the processor. This causes the disassembly filter to be tur}ned on, but will not automatically toggle the display screen. Continuting to press the Op}tion button will continue to single step the processor. See Single Step section for more } information.THE COMMAND INTERPRETERThe command interpreter is a code module that allows a user to issue keyboard comma}nds to EXDDT. The command window is shown in the lower right hand portion of the display screen. The left-hand part of this d}isplay is used for showing the register state of the machine.Each command is a single keystroke command. However, depending} upon the command, additional arguments might be required. If the first key typed is not a valid EXDDT command, it will be ig}nored.The EXDDT Keyboard Commands are :B <1-6>,..- Breakpoint 1-6 at location addrD ..- Deposit hex string or enter mini-assemE .....- Examine address addrG ...... - Go to addr}ess addrH .. - Hex/Decimal con- verterI ............. - Interpretive modeM <0-2>,<}addr>..- Monitor 0, 1 or 2 bytes at addrN .............. - Next instructionR ,..- Re}gister selected is loaded with byteS .- Search for hex stringT <1-2>,....- Trap at address addrV ........ - Variable trap functionW .......... - Window filte}r toggledown arrow . - Pull display window downup arrow ..- Push display window up* }.- Set the Program counterThese commands are described in the following pages.------------------------------------------}------------------ENTERING A VALUESeveral of the keyboard commands require that you enter one or two values. All entries} are terminated by pressing the RETURN key. When two values are needed, as with the Breakpoint command, a COMMA should be use}d to separate them. Pressing RETURN without having entered a value will result in the entire command being ignored.(Excepti}ons - see the Breakpoint, the Trap and the Monitor Commands)In the explanations that follow, these abbreviations are used }: = an address value, up to 4 hexadecimal digits<1-6> = either a 1,2,3,4,5 } or 6= either A,X,Y,S or P = a single byte value, up to 2 hexadecimal }digits = a hex string up to 12 characters (i.e. 6 hex digits)<@> = special chara }cter used to enter mini- assembler<>> = special character used to indicate the } current position<*> = special character used to indicate the contents of the  }PC<'> = special character used to signify a symbolic reference = a hex number, w }ith an 'H' followed by up to 4 hex digits = a decimal number, 0<= dnum <= 6 }5535The command interpreter (CI) ignores certain characters, such as spaces, '$'s and even ')'s. When values such as addre}ss values are expected, typing characters that are not hex characters will result in an input error. The CI signifies an inpu}t error by flashing the screen. To erase a character, use the DELETE key.For input convenience, there are several special c}haracters, "*",">", and "'". These are used as shorthand ways of entering commands. * means the current value of the PC and >} means the current position. The ' is used to indicate a symbolic reference. For instance 'BRKKEY means the address of the }symbol BRKKEY. Any symbol in the mini symbol table or any of the predefined system symbols can be symbolically referenced. Th}is is a very powerful and useful feature, and is equivalent to having a built in partial memory map. Anytime an address is ex}pected in a command (), these special characters can be typed. The * by itself is used to change the contents of the PC}.------------------------------------------------------------BREAKPOINT B <1-6>,The Breakpoint command is used} to set one of the six breakpoint registers to a location. If a value other than a 1-6 is entered for the breakpoint register}, the command will be terminated. Note that two values (the breakpoint register number, and the breakpoint location) are requ}ired for this command. Thus a comma must be typed after the breakpoint number and before the address for the breakpoint.Whe}n a breakpoint is set, that location should show up in the breakpoint register display. Physically, a '0' for the BRK instruc}tion is stored in memory at the requested location. If an Examine command is issued to look at that part of memory, a '0' wil}l be seen, even though the proper mnemonic is shown in the disassembly. If a breakpoint is set at an examined location, the m}nemonic will be shown in inverse video. If a breakpoint register is already in use when a new breakpoint is requested, the ol}d breakpoint is first restored.To clear a breakpoint register and restore the source code, type RETURN after selecting the }desired breakpoint register (e.g. typing 'B' then '1' then RETURN will clear breakpoint 1 and restore the source code). Tryin}g to clear a breakpoint that is not set will not harm anything. EXDDT checks to see if a desired breakpoint is actually set,  }and if not flashes the screen and clears the breakpoint register. This could happen, for instance, if you try to set a breakp!}oint in ROM. You can use the special shorthand characters in this command. For instance, to set a breakpoint at the current "}location being examined in the display window, you could type : B 1,> (and press RETURN).--------------------------------#}---------------------------DEPOSIT D The Deposit command is used to place a string of bytes in memory. A stri$}ng of hexadecimal values (up to 12 characters, 6 hex bytes) may be entered. The values entered will be placed in successive l%}ocations starting at the current position indicated in the display window, replacing whatever was there. The input string is &}decoded two characters per hex byte at a time. If there is an odd character left at the end, it will be interpreted as the lo'}w order nibble of a hex value. For example, entering a string of 01AAB0 will result in three bytes (01, AA, and B0) being pl(}aced in memory. However, entering 01AAB will result in 01, AA, and 0B being deposited. Note that depositing a byte or a serie)}s of bytes will not move the display window. This must be done with the examine or the push and pull window commands.EXDDT *}is able to switch screens by saving 13 locations the operating system uses in managing the system graphics. Thus, before each+} value is deposited, it is examined to see if it should be deposited to these graphics locations. If so, the value is placed ,}instead in an internal save table. Similarly, if one of these saved locations are defined as a mini-symbol, then the value sh-}own will be taken from the saved location. Thus, for example, you can deposit values directly to the color shadow registers a.}nd affect the color of the user screen and not the EXDDT screen. You might note that this works only if you deposit directly /}to these locations using the D command. If you're single stepping through a program that deposits to these locations, then th0}e new value will be deposited to the current locations, i.e. to the EXDDT's settings. Toggling the screen twice will restore 1}EXDDT's normal screen.If the character '@' is typed after a D, EXDDT enters a special mini-assembler mode, as will be indic2}ated in the command window. In this mode, assembly language commands can be deposited directly, e.g. LDX A000. Or, STA ($12,X3}). Once this mode is entered one instruction at a time is deposited. To exit, merely press RETURN with no value entered. Note4} also that in this mode the > sign for the current position is removed. Instead a < sign is shown to indicate the current dep5}osit position. This position moves after each assembly language instruction is deposited, even though the window itself remai6}ns fixed. If this indicator moves off the bottom of the screen, the mini-assembler deposit mode is automatically exited.You7} may use the $ or not, EXDDT ignores it. All values must be in hex, and symbolic references aren't allowed within the mini-as8}sembler. EXDDT also ignores spaces and even right parentheses. Therefore you can type in some funny looking instructions that9} EXDDT interprets as being hunky dory.EXDDT checks to see if the instruction you entered is actually deposited in memory. I:}f the result after depositing isn't equal to the desired deposit values, the screen is flashed and the mini-assembler is exit;}ed.------------------------------------------------------------EXAMINE E The Examine command is used to set the d<}isplay window to view an area of memory. The extreme left hand edge of the display window has a GREATER THAN sign (>) in the =}4 th row. This points to the current position that was entered as the address in the 'E' command. Note that the 'E' command d>}oes not change the state of the display window filter, nor will it affect which instruction will next be executed by a single?} step command.Remember, you can use symbolic references in this command to examine standard system symbols or mini-symbol t@}able symbols (e.g. E 'CIOV ).-------------------------------------------------------------GO G The Go commanA}d is used to begin execution at a specific location in memory. Before control is transferred to this location, all registers B}are updated based upon the current contents of the displayed registers. This is true for all commands involving code executioC}n.------------------------------------------------------------HEX/DECIMAL CONVERTER H The H command is usedD} for a hex to decimal / decimal to hex converter. To enter a hex number to be converted, type an 'H' followed by up to 4 hex E}digits and then press return. This means you will type 2 Hs, one for the command, and one to signify a hex number. A colon wiF}ll be displayed, followed by the decimal value for the hex number you entered. The result will remain in the command window uG}ntil you type any character.To enter a decimal number, just type the number itself after the H command and then press returH}n. EXDDT will display a colon, an H to signify the hex value for the decimal number you entered, and then the hex value. If yI}ou enter a number bigger than 65535, EXDDT will flash indicating an error.-------------------------------------------------J}-----------INTERPRETIVE MODE IThe Interpretive Mode command is used to place the system in an automatic single step modeK}. After each instruction is interpreted, the screen display is updated if the EXDDT screen is turned on. The display window iL}s automatically placed in the disassembly mode. Pressing the BREAK key halts the interpretive mode. It is possible to run ROMM} programs such as portions of the O.S. interpretively, but problems with the display and timing can arise. The Trap register N}is used for setting up the equivalent of a breakpoint in this mode. Interpretive mode will run with either the user screen orO} the EXDDT screen being shown, but you pay a severe time penalty for selecting the EXDDT screen. Interpretive mode runs much P}faster if the user screen is selected because EXDDT does not have to update it's screen if it is not active.If you have V mQ}arked symbols in the mini-symbol table, EXDDT checks to see if their values change after an instruction. If so, I mode is halR}ted. This feature is active only if EXDDT is displaying its screen.--------------------------------------------------------S}-----MONITOR M <0-2>,The Monitor command is used to modify the mini symbol table. After typing M, a '0', '1' or 'T}2' should be typed to indicate how many bytes should be displayed. The is the location you want to monitor.After entU}ering this command, the cursor will be positioned in the symbol table. Typing RETURN will move the cursor successively to eacV}h variable in the table. This allows you to select where in the table to put the new variable. When the cursor is positioned W}where you want to start the new entry, typing any character other than RETURN will begin the definition of the new label. PreX}ss RETURN after entering the label and the new variable will be entered into the symbol table.There is one special case witY}h the M function. Entered by itself (i.e. pressing RETURN right after typing M), it is a signal to switch the value display f}-----------------------------------------------------------NEXTThe Next command is used to place an internal breakpoint a[}fter the next instruction to be executed. Control is then transferred to the code. In most situations, this will act like a \}single step instruction, with EXDDT being immediately recalled. However, if the instruction is a JSR, a branch instruction, o]}r any other instruction that can alter program flow, then control might not immediately return. This allows (in most instance^}s) a way to single step over a JSR instruction.If you try to do an N command when examing code in ROM, the screen will be f_}lashed and control will not be transferred to the next instruction.-------------------------------------------------------`}-----REGISTER R ,The Register command is used to modify the contents of some of the 6502's registers. Ta}yping a character other than A,X,Y,S or P after the R will result in the command being terminated. Note that this command reqb}uires two separate values, so a comma must be typed after the register designation.---------------------------------------c}---------------------SEARCH S The Search command is used to locate a specific sequence of hex characters in memod}ry. You may enter a hex string of up to 12 characters (6 bytes). Memory will be searched from the current position indicated e}in the display window up through memory. If the search is successful, the display window will be repositioned. If it is unsucf}cessful, the command window will simply be cleared for the next command.If no value is entered after the 'S' (i.e. just a dg}elimiter is typed), the previous search string will be used. This will allow for easily finding multiple occurences of the seq}B'DOS SYSB-+AUTORUN SYSB XFONT SETBaDOC 000ByDOC 001BxZDOC 002B<GDOC 006BNDOC 007B DOC 008BADOC 009B!ANTICTL2BASB&CHOPPERHMAPB-SHIP MAPB 2CHAR31 MAPB ;CHAR23 MAPBDSEQ1 PGMBFSEQ2 PGMBHANTIC PGMBNSHIP PGMBQMENU PGMBVTITLE PGMB\SELECT1 PGMB^SELECT2 PGMBbAUTHOR PGMBfRAYGUN SNDBgCASTLE1 SCRBvTURRETA SCRBwTURRETADSCRBxTURRETB SCRByTURRETBDSCRBzTURRETC SCRB{TURRETCDSCRB|CLEAR SCRBFLASH SCR/]5BPgĀĀgĀ g `!!&g"."##x$ $&%%_ '^'(Ug&U)̀(arch string.If, however, a Deposit command is issued, the area where the Search string was stored is overwritten. In this cr}ase, the old search string is wiped out.------------------------------------------------------------TRAP T <1-2>,s}The Trap command is used for setting one of the Trap breakpoints to a specific location. The address entered should show up it}n the proper Trap register. Note the trap will only work when in interpretive mode. To clear the trap, type 'T', a '1' or '2'u} for the trap register you want to clear and then press RETURN. A 0000 should show up in the register.--------------------v}----------------------------------------VARIABLE TRAP VThe Variable trap function is used to activate an interpretive tw}rap on the alteration of any byte or word variable. Typing V moves the cursor to the V column on the mini symbol table area. x}Typing subsequent RETURNs moves the cursor circularly thru the list. Typing a minus sign (-) causes a dash to appear on the sy}creen at the selected variable. Typing the SPACE BAR removes a previously placed dash. Typing any other character causes a rez}turn to the command intrepter.Any time a displayed variable changes, a vertical bar (|) is placed in the V column next to {}the variable entry. If the variable was previously selected with a dash, a plus sign (dash and vertical together) is displaye|}d. If EXDDT is running in the interpretive mode (I command), modification of a dash selected variable will immediately halt i}}nterpretive execution. This can be used to trace where in a program a particular location is modified for instance.-------~}-----------------------------------------------------WINDOW WThe Window command is used to change the 'filter' over the }display window. 'W' toggles between the filters. Two filters are available, a disassembly filter and a hexadecimal filter.}------------------------------------------------------------PULL WINDOW DOWN down arrow The Pull Window command is used }to pull the display window down. Depending upon the display filter in place, this will pull the window down one byte (hex fil}ter) or by one full instruction (disassembly filter). Note that Auto Repeat on the keyboard is active, so that continuing to }press the down arrow key (i.e. the '=' key) will continue to pull the window down.If the shift key is held down while typin}g the down arrow character, the screen will be pulled down a full screen each time.---------------------------------------}---------------------PUSH WINDOW UP up arrowThe Push Window command is used to push the display window up. Depending up}on the display filter in place, this will push the window up one byte (hex filter) or by one full instruction (disassembly fi}lter). Again the Auto Repeat on the keyboard is active, so that continuing to press the up arrow key (i.e. the '-' key) will }continue to push the window up.If the shift key is held down while typing the up arrow character, the screen will be pushed} up a full screen. A problem occurs however when you arbitrarily examine an area of memory with the disassembly filter in. If} you try to push the window up, there is not enough information to be able to tell if the preceding instruction was one, two }or three bytes long. EXDDT keeps track of how many bytes the window is moved each time you pull the window down. Thus you can} push the window back up if you have previously pulled it down past an instruction or group of instructions. Refer to the tec}hnical appendix for information on this feature.------------------------------------------------------------RESET PROGRA}M COUNTER * The * followed by an address is used to reset the program counter. You can use the special short hand c}haracters in this command. So, for instance, to set the PC to where you're examining in memory, type * >. To set the PC to o}ne of your mini-symbols, type * 'LOOP1.EXDDT ENTRY POINTSThere are three ways of entering EXDDT: FLASH ENTRY WARM }ENTRY BREAKPOINT ENTRYFLASH ENTRYThis entry point is provided to allow immediate entry to EXDDT regardless of other }circumstances. This is a single keyboard special character, and is set up as [CTRL] [SHIFT] ESC (i.e. pressing the Control, t}he Shift and the Escape keys at the same time). When EXDDT is initialized, the operating system code that looks at the keyboa}rd is modified so that it looks for the special character first before handling normal keyboard input. If this character is f}ound, EXDDT is entered immediately through the FLASH ENTRY point.Pressing START will return control to wherever the process}or was when the EXDDT special character was typed. For more information on the Flash entry mechanism, see the Keyboard Scanne}r section in the Technical Details appendix.WARM ENTRYThis entry point is the starting point for the EXDDT code. The fir}st three bytes of EXDDT are a JMP to the set symbol table routine. The EXDDT code itself immediately follows this. If this lo}cation is called via a JSR instruction, then the START button exit will return control to the calling point. This allows EXDD}T to be called at various program locations for setting up breakpoints, changing values, etc. Example . .--}your code-- . PHA ;this doesn't mean ;anything, only an ;example JSR $6003 } ;the address of the ;unrelocated version ;--Pressing START will return here-- .--your} code-- . .BREAKPOINT ENTRYBreakpoint entries are the most common way of entering EXDDT. The breakpoints firs}t have to be set up via a FLASH or WARM entry to EXDDT. After they are set, EXDDT will be called if those specific instructio}ns are executed. Exits from EXDDT breakpoints return to the code sequence where the breakpoint was located. Notice that the b}reakpoints will remain in place unless they are explicitly cleared, or RESET is pressed. This is true even if a breakpoint ha}s been tripped.Recall also that if the trap register is set in interpretive mode, then attempting to execute the instructio}n at that address will halt the interpretive mode. Thus to move past a trap breakpoint in interpretive mode, you have to eith}er clear the trap or single step past the instruction that was trapped and then enter interpretive mode.APPENDIX (TECHNICAL} DETAILS)INTERACTIONS WITH DOSEXDDT is designed to be compatible with most programs that adhere to Atari O.S. design con}siderations. EXDDT can either be loaded first separately or placed as a header file for the program of interest. EXDDT is set} up to return to the program that loaded it after loading and initializing. Normallly, the preparation sequence would be to l}oad whichever editor you use and then create the assembly language source file. Next, load your assembler and create an objec}t code file. At this point you would load EXDDT.OBJ, which would load, initialize, and then return to the DOS you're using. F}inally, From there you would load the actual object code itself.KEYBOARD SCANNERDuring EXDDT initialization the system k}eyboard vector is redirected to a preprocessor which checks for the EXDDT FLASH ENTRY special character ([CNTL][SHIFT] ESC). }If this character is seen, control transfers to the FLASH ENTRY point, otherwise control passes to the normal keyboard proces}sing routine.Note that keyboard interrupts MUST be enabled. Pressing RESET will usually reset the system vectors, even if t}hey have been changed.EXDDTS USE OF SYSTEM RESOURCESEXDDT itself occupies 8K of memory space. The preassembled version i}s ORGed at $6000, with 600 additional bytes at $5C00. Every attempt was made to minimize EXDDT's use of system resources. Unf}ortunately, it is not possible to completely avoid using resources in 3 areas: Page Zero Ram, a storage area for EXDDT variab}les and some screen storage, and the major portion of the screen display.Page Zero - After much deliberation, I convinced m}yself that EXDDT would simply have to use a large portion of the upper half of Page Zero. One main implication of this is tha}t if a cartridge is installed that uses the upper half of page zero, then you won't be able to run that cartridge interpretiv}ely using EXDDT. In many instances you will be able to call EXDDT from the cartridge, and then reset to get back to the cartr}idge. All of the Page Zero locations that are not normally touched by BASIC or the Assembler/Editor cartridge are kept open }for your usage ($B9 - $DB are unused. Thus you can write and debug programs that use these locations in Page Zero. The untouc}hed locations include the ones Basic uses for error information and the floating point register that interfaces with USR call}s. You can easily create assembly language routines that will run when called from Basic.EXDDT Variable storage - The area }from $400 - $584 is used by EXDDT for local variable storage, the symbol table and parts of the screen display. One thing thi}s means is that you won't be able to debug programs which use the cassette buffer, or the floating point scratch area.EXDDT} Screen Display - Finally, EXDDT needs another 600 bytes for the main portion of its screen display. In the preassembled vers}ion this is set at $5C00. However, this is easily relocated, as location $FE contains a pointer to the intended screen loacat}ion area. Each time EXDDT sets up its display screen, it looks at loacation $FE to get the location where the screen should b}e built. To put the display window screen in another place, for example $5800, simply create a small assembly language progra}m like: ORG $FE DW $5800(Users of some assemblers may need to use *= instead of ORG).Assemble this c}ode fragment and copy the object code to the EXDDT.OBJ code using the append option. Thus when EXDDT is activated, it will se}e your pointer to the desired screen area.You can also set this location from within your program under test. Look at the p}rogram TEST.MAC to see an example of this.DISPLAY WINDOW MOVEMENTEXDDT maintains a "pull stack" while the disassembly fi}lter is in place. This means that each time you pull the display window down, EXDDT places the number of bytes that the windo}w was pulled in a stack. Thus when you want to push the window up, EXDDT checks to see if there are any values left in the pu}ll stack. If so, you can push the window up. If not, nothing happens. The pull stack is cleared whenever EXDDT is entered, or} when an Examine command is typed. To conserve memory, 4 pull values (which will be a 1, 2 or 3) are packed into each byte in} the stack. A total of 64 bytes are reserved for the stack. Thus you can pull the window down 256 times before the stack runs} out. After this occurs the first values in the stack are lost and you can't back up as far. In computer terms, the stack is }implemented as a circular buffer.THINGS TO WATCH OUT FORThere are a few areas where you have to be careful in using EXDD}T. In general, these occur when you are single stepping or running interpretively. If the interpreted code messes around with} the display list, or with ANTIC, or CTIA/GTIA, then you might end up with a scrambled screen. Usually this is non fatal, jus}t distracting. To restore the normal EXDDT screen, press the BREAK key to halt the interpretive mode, then press SELECT twice}.Trying to do I/O from disk or any other real time activity in either interpretive mode or single step mode will probably n}ot work. You should set up breakpoints so that this type of I/O is done in real time, and then call EXDDT.RELOCATING EXDDT}.OBJThe version of EXDDT.OBJ that comes with this diskette is ORGed to load and run at $6000 hex. The display screen is set} to default to $5C00. This loacation was picked to put EXDDT.OBJ up pretty high above areas where you might want to ORG your }code, yet not run into the normal areas for standard O.S. display screens. If for some reason you want to relocate EXDDT, the}re is a Basic program provided called RELOCATE which you can run. Listen, if you're looking for elegant relocaters, don't loo}k at RELOCATE. It is implemented in the most simple fashion I could think of. Namely RELOCATE has a list of the locations tha}t need to be changed to have EXDDT run at some new location in memory. EXDDT must be set up so that it starts on a Page bound}ary, so when it asks for a relocation address, only a two character hex value need be entered. RELOCATE assumes that EXDDT.OB}J is located on in drive 1. It also assumes the new file will be called EXDDT.REL. Naurally, you can rename the new file afte}r it has been created. RELOCATE then asks where you would like the new version of EXDDT to load and execute. Finally, RELOCAT}E asks for a new default location for creating the display screen. Again, this should begin on a page boundary, so only a sin}gle hex byte value should be entered. RELOCATE will work automatically from then on. Might as well go get something to drink }now, 'cause it's gonna take a few minutes (about eleven) for this pore li'l Basic program to work. Adios Amigos. Now get out}ress of the next instruction to be executed, EXDDT wil halt the interpretive mode. This allows pseudo breakpoints to be place }d in ROM locations. Thus it becomes much easier to reach a certain spot in the ROM code by setting a trap, and running in int }erpretive mode than by single stepping up to the desired location.ot in the ROM code by setting a trap, and running in int Erom variable values to variable locations or vice versa. This display will toggle back and forth.witch the value display fd there and get those bugs before they get you.t eleven) for this pore li'l Basic program to work. Adios Amigos. Now get out/t is a signal to switch the value display from variable values to variable locations or vice versa. This display will toggle }back and forth.witch the value display from variable values to variable locations or vice versa. This display will toggle  BUFFER and BUILDER are now on volume 1 of the library.This animation is used as an example in the tutorial so you will wan)}t to view it a couple of times. This sequence was built by the EDITOR almost entirely by EDITOR programs, and all these prog)}rams, screens and maps are included on the disk. You can rebuild this sequence from the original programs if you want. It tak)}es about 90 minutes to build. and Symbol Tables.The mapper program will convert between maps used by the editor, and symbo(5. Possible Modifications to the EDITOR.Since you can get at the source code of the EDITOR, you can modify it if you want. -}If you choose to do so there are a few things you should know. The editor is out of space, it is full, only 30 or so bytes -}remain for inserting any last minute fixes. This program contains every trick I know to reduce program size. The editor uses -}120+ variable names and you are only allowed 128. Do not have any grandios schemes of adding any major features, they are not-} going to fit.However, there is one change that you might consider. If you do not have Paint by Reston the Fix command is n-}ot only useless, it is posatively dangerous. Delete the code supporting the fix command (2900-2960) and type a space over the-} F in the CMD$="......" statement (9210). Do not delete the F, this table is positional. Then run the program and do a Q S. S-}ubtract 60 from the number it returns and add this number to the length of CT$ (9110). This will allow you to use longer user-} maps. Do not forget to change the Mapper program to allow the new length.You could do the same with the A comand if you ab-}solutely posatively never intend to change the default extenders. If you have one drawing program and you NEVER intend to get-} another, then you could remove its support code. In all cases just add the bytes you free up onto the user map buffer CT$ an-}d change MAPPER to handle the new size. Never have less than 50 bytes of free space or you will run into strange and inexplic-}able problems. I think parts of Basic and maybe parts of the operating system assume that there will always be some free spac-}e, and use it as a work area. This is just a guess on my part, the problems that arise are wierd.In your programs that disp-}lay the screens you will only use one of the SCRLD routines. If you intend to work in graphics modes that are not supported b-}y the editor, like graphics 8, or Antic Mode 4, then use the other routines to write your own utilities.6. MAC65 Source C-}ode Available.If anyone is interested in how the routines work, send me $14.99 to cover postage, packaging and profit and I-} will send you a copy of the MAC65 source code and macro libraries. This includes all the routines on these disks, and one or-} two that didn't make it.These macro libraries were written specifically to support combining 6502 assembler with Basic pro-}grams, and have many special features to that end. They produce extremely complicated, but very compact object code, but are -}remarkably simple to use. The MAC65 source code written using these libraries looks a lot like a high level language, and is -}very easy to follow. A relative beginner could quickly use these libraries to write their own routines, and they could easily-} by added to BUILDER and combined with other library modules.The macros themselves are extremely complicated and very hard -}to follow. They were written to produce compact, efficent, powerful code, rather than to serve as programming examples. You w-}ould need to be an expert programmer to hope to understand what the macros are actually doing, I have trouble following them -}myself. The object code they produce is relatively easy to follow, and the source code is a snap. They have been heavily test-}ed, and are fully documented so they are very easy to use. The macro libraries themselves took me over 8 months to write and.} debug, but none of the routines that use the macros took over an evening to develop.I make this distinction so no one will.} buy this package and be dissappointed. If you want to learn and understand macro writing, then the MAC65 Toolkit by OSS is a.} good choice. My macros will drive you scatty. If you want to write easy to read, efficient routines, that can be quickly dev.}eloped and tested, and combined with Basic, then this package is an excellent choice.7. ERRATA (The muse of programmers)..}All programs contain bugs! This is an established fact. I just want to mention three bugs you should watch out for here.T.}he first is a bug in DOS 2.0S, which may also be in other versions of DOS. If you open a file for update (OPEN #1,12,0,"D:MYF.}ILE") then do a POINT and then write a block of data that crosses a sector boundary, either via PBYTE or Basic PUT statements.}, then DOS garbles the sector chaining pointers on the sector after the one you started writing on. When you try to access th.}at file you get error 164. Your file is lost. This is an extremely nasty error which I don't think has been previosly documen. }ted.The second is a bug in BASIC. Basic does not handle powers correctly. For instance, version C Basic thinks that 3^2 (3 . }squared) is 10. This bug varies from version to version of Basic. HEXCALC has a correction factor build into it that makes it. } work correctly but I do not know if this will correct the problem on BASIC A or BASIC B. You might like to check it out befo. }re you use HEXCALC to do your Maths Homework.The third problem is a bug in the TAIL routines. (AAAGGGH!!! Yes, I make mista. }kes too!) Under certain circumstances the TAIL routines may not recognise the first string you dimension as being a string. T.}he result varies depending on which routine you call, usually you get a string error. The easiest way to avoid this error is .}to GOSUB the loader routines before you DIMension your strings. Another easy way is to dimension any array you are using or a.}ny string that wont be used with the TAIL routines first. The third way is to make sure that your first string is also the fi.}rst variable used in the program.Since I know about this bug, you may wonder why I don't fix it. To do so I would have to m.}ake the AUTORUN.SYS file about 120 bytes longer. Then it wouldn't end on a 2K boundary, and if you needed a boundary aligned .}buffer, you would end up wasting up to 2K of memory. Since the bug is so easy to avoid, I decided to leave it alone, and admi.}t to my mistake. By the way, do you know the origin of the term program bug. When they were testing one of the first.} computers, they couldn't get it to work properly. After careful checking the engineers found a dead moth in one of the circu.}its. They removed it and everything worked. They joked that they had debugged the computer, and the term stuck. The original .}kamakazi moth is preserved in a museum somewhere, the Smithsonian I think.8. Parting Words.Well the Dragons Tail Disks .}are now complete. I certainly hope you have a lot of fun with them. Some of the techniques involved are a little complicated,.} but I know you will soon get used to them. If you come up with something your really proud of, by all means send me a copy. .}I would be really interested to see what someone with some artistic or musical talent can do with the EDITOR. I have never be.}en much good at either myself. If I get a good reader response I will try to put out a disk containing the best animations, A.}NTIC willing.I would like to thank Charles Cherry of Antic, for his guidance in packaging these disks. Charles Jackson and .}Patrick Bass of Antic for there help with the file formats of various drawing packages. Lastly I would like to thank Jim Hass.}el of Fairbanks, Alaska whose letters on Dragon Quest encouraged me to try and package these routines.If you have any comme.}nts, routines you want to see, changes you would like, or just questions, then please contact me. There is a possibility of t. }hird and fourth Dragons Tail volumes but it is really up to you. Let me know what you would like to see. If the demand is the.}0 FE ##CONVERT ATARIWRITER+ TO ANTICd;@,;@,n2"}6.D1:TAIL2DOC.000x-@@ 6.=:,6-@&B:,-67@<@,.1-67<@,.2 2#}@@2( CONVERTING 67@<@,.2* @@* A3)@2$}@)*@3 A?6-@*@(6-@ 5*@? A@@2%} D1:ANTICTL2.BAS ##CONVERT ATARIWRITER+ TO ANTICd;@,;@,n0&<AB3333311111111133333333333333333333333333333111133333111111111111311111111132223222323332223222322232223111111113111111116'}113333311113113233323332333233323333233332311111133333111131113113333331113222322332333223323333233323311111131133333311133336(}333331111333232333233323332333323333331111133333333311113333333111111322232223222322232223323332331111133333331111111311311336)}333333333333333333333333333333333333331311311111111111333331111133333333333333333333333333333111111113333311111111311111111136*}222322232333222322232223222311111111311111111113333311131113233323332333233323333233332311111133333111311113113333331113222326+}233233322332333323332331111113113333331113333333331111333232333233323332333323333331111133333333311113333333111111322232223226,}232223222332333233111113333333111111131131133333333333333333333333333333333333333331311311111113222322232223111111113111111114_ ABC11111111111111111111333331111111133333333311113333333333333133333333333333331311311311311333333333333333333333333333333:.}30333333333333300003322222330000000020202000000000000200000001111111111111111111133333111111113333333331111333333333333313333:/}33333333333331131131131133333333333333333333333333333333033333333333330000332222233000000000222000000000000202000000111111111:0}11111111111333331111111133333333311113333333333333133333333333333331131131131131333333333333333333333333333333303333333333333:1}000033222223300000000222220000000000202020000033111133333333333331333333333333333313113113113113333333333333333333333333333338.A @ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!"#$%&'()<>-_=|+\*^,.[]/?;:111111111111111111111111111111333313313333313331313331313>3}33133331131131133333131331331333133331133131133333331133131131133331131131333331331333331331333313113113133311311311331333331>4}33133313133133113113113113333133333133133133333133133133133333133133133333313133313113113333133133113333313133313133133333113>5}33113333333131131131131313313313313333313313313313131313313313333313313313131313313313313131131131333113131311333131131131131>6}13133111313131133333311333311333331131131133313133331133111333131131133331333333311313131131133331333331333333331333311311313>7}13133133131311311311311111313133131111111113133333133333133133113131133133111131313111131313131313131331311311111111111313113>8}11311131131113113113131113131311131113311131113131311111111333111111111111111111333111333111333111131131131131131111131333131>9}11111131113111311131313133313131311113131331311111111111113113111111111113313333131131131133113311311311313311111313131111133>:}3113131111131111131111131131111131111131111#$%&'()<>-_=|+\*^,.[]/?;:111111111111111111111111111111333313313333313331313331313<+) @ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-.?333333333333333333333333333333333333333333333333333332223232323232223232333332233B<}23232233232322333333222323332333233322233333223323232323232322333333222323332233233322233333222323332233233323333333222323332B=}33323232223333323232323222323232323333322233233323332332223333333233323332323232223333323232323223323232323333323332333233323B>}33222333332323222323232323232333332223232323232323232333332223232323232323222333332233232322332333233333332223232323232333222B?}33333223323232233232323233333222323332223332322233333222332333233323332333333232323232323232322233333232323232323232332333333B@}23232323232322232323333323232323323323232323333323232323323332333233333322233323323323332223333332333233323332333233333322333BA}32332332333222333332223332322233323222333332333233323332223323333332223233322333323223333332333233322232323222333332223332332BB}33233323333333222323232223232322233333222323232223332333233333323323232323232332333333333333332223333333333333333333333333223BC}3223333332223332332333333323XYZ1234567890-.?333333333333333333333333333333333333333333333333333332223232323232223232333332233@B A SEQ1M CASTLE17 2M LANDING7 1M TURRET6 30M ANTIC6 30M TURRETD6 30M TURRETB6 30M CLEAR6 30M TURRETBD6 30M FE}TURRET6 30M TITLE6 30M TURRETD6 30M TURRETC6 30M AUTHOR6 30M TURRETCD TURRETB6 30M CLEAR6 30M TURRETBD6 30M DPB A SEQ26 30M TURRETB6 30M CLEAR6 30M TURRETBD7 1M MENU7 18 0 198 2 68 1 198 6 68 2 22 4 26 30M SELECT1M SELECJG}T28 0 0 0 08 1 0 0 08 2 0 0 0T A6 30M TURRETBD7 1M MENU7 18 0 198 2 68 1 198 6 68 2 22 4 26 30M SELECT1M SELECH%* ANTIC* MAGAZINE.* THE ATARI* RESOURCE.** BUILD WORK MACROS*B M W1 FLASH IN CHARACTERQ #0 #1#3 E 1I #2 ANTIC*ENI}#3 E 2I #2 MAGAZINE,*E#3 E 3I #2 THEATARI*E#3 E 4I #2 RESOURCE.*E#2 + 1#0 + 1#1 + 5Q #0 #1C 2I L 27 42O X3M NJ}RAYGUN.SNDO FVL BC 1I L 27 42#0 + 3#1 - 5T M*B M W2 PAUSE BETWEEN LINES#2 = 1#1 + 6#3 + 1O X36 30O FVL BTNK} M** INITIAL SET UP*L U CHAR31L C CASTLE1VL BB A ANTICM TURRETA6 30*#2 = 1 CHARACTER#3 = 1 WORD#0 = 12 COLNL}UMN#1 = 8 ROWR W1 5R W2#0 = 12R W1 9R W2#0 = 16R W1 3#0 + 4R W1 5#0 = 16R W2R W1 9R W2M TURRETAD6 30TX W1NM}.PGMX W2.PGML C CASTLEL X ANTICESOURCE.** BUILD WORK MACROS*B M W1 FLASH IN CHARACTERQ #0 #1#3 E 1I #2 ANTIC*EL#* LANDING SEQUENCE* WITHOUT LANDING GEAR* WHICH WAS CREATED BY HAND*B M W1 ONE LANDING CYCLEVNI C @3J D #0W CO B3RO}6 #1O F#0 + 1#1 + #2#3 + 1#3 > 67#3 = 65*ET M* INITIAL SEQUENCEL U SHIPL C CASTLE1Q 20 84#0 = 1 STARTING JUMPRP}#1 = 5 STARTING DELAY#2 = 0.2 TIMER INCREMENT#3 = 65 ASCI "A"B A SHIPR W1 58T AX W1.PGML C CASTLE1L X SHIPO B3Pw* MENU** BUILD WORK MACROS*B M W1 FLASH IN CHARACTERQ #0 #1#3 E 1I #2 1-EDITOR*E#3 E 2I #2 2-MAPPER*E#3 E 3I #VR}2 3-BUILDER*E#3 E 4I #2 4-BUFFER*E#2 + 1#0 + 1#1 + 5Q #0 #1C 2I L 27 42O X3M RAYGUN.SNDO FVL BC 1I L 27 42VS}#0 + 3#1 - 5T M*B M W2 PAUSE BETWEEN LINES#2 = 1#1 + 6#3 + 1#0 = 16O X36 30O FVL BT M** INITIAL SET UP*L UVT} CHAR31L C CASTLE1VL BB A MENUM TURRETA6 30*#2 = 1 CHARACTER#3 = 1 WORD#0 = 16 COLUMN#1 = 8 ROWR W1 8R W2VU}R W1 8R W2R W1 9R W2R W1 8R W2M TURRETAD6 30TX W1.PGMX W2.PGML C CASTLE1L X MENUE 2I #2 2-MAPPER*E#3 E 3I #T^* DRAGONS TAIL.* VOLUME 2.* GRAPHICS** BUILD WORK MACROS*B M W1 ZAP IN CHARACTERQ #0 #1#3 E 1I #2 DRAGONS TAIL.ZW}*E#3 E 2I #2 VOLUME TWO. *E#3 E 3I #2 GRAPHICS. *E#2 + 1#1 + 6C 3Q #0 #1#0 + 3I L #0 #1#1 + 1#0 - 2Q #0 ZX}#1C 2I L 27 42O X3M RAYGUN.SNDO FVL BC 1I L 27 42#0 + 3#1 - 7T M*B M W2 PAUSE BETWEEN LINESO X36 30O FZY}VL B#0 = 8#1 + 6#3 + 1#2 = 1T M** INITIAL SET UP*#0 = 8 COLUMN#1 = 8 ROW#2 = 1 CHARACTER#3 = 1 LINEL U CHAR23LZZ} C CASTLE1VL B** BUILD FILE*B A TITLEM TURRETA6 30R W1 14R W2R W1 14R W2R W1 14R W2M TURRETAD6 30T AX W1.PGZ[}MX W2.PGML C CASTLE1L X TITLEPHICS** BUILD WORK MACROS*B M W1 ZAP IN CHARACTERQ #0 #1#3 E 1I #2 DRAGONS TAIL.X!* LEFT MOVEMENT OF* SELECT AND CHOPPERS*B M W1Q #0 1VNI C AZ D 1Z U 2O B36 3O FVNI C BZ D 1Z U 2O B36 3^]}O F#0 - 1T M*#0 = 79L C CASTLE1L U CHOPPERHVL BB A SELECT1R W1 77T AX W1.PGMVL X SELECT1Z D 1Z U 2O B36 3\g* CHOPPER DECENT*B M W1VJ D 136 3T M*B M W2J U 1W C36 3VT M*B M W3J U 1W C36 6T M**L C CASTLE1L U Cb_}HOPPERHNQ 80 0C 1I R 143 7Q 83 1I C AVL BI C BO XB A SELECT2R W1 10VQ 91 12I L 96 12Q 126 12I L 130 12Q 96 b`}6C 0I R 127 11Q 80 5I L 143 536 3V36 3VQ 96 12I L 127 12C 1Q 80 13I L 95 13Q 128 13I L 144 13R W2 16R W3 5ba}T AX W1.PGMX W2.PGMX W3.PGML C CASTLEL X SELECT1L X SELECT23VT M*B M W3J U 1W C36 6T M**L C CASTLE1L U C`C* AUTHOR*B M W1Q #0 #1#3 E 1I #2 BY *E#3 E 2I #2 ED CHURNSIDE *E#3 E 3I #2 C. 1986. *E#2 + 1#1 + 6Q #0 #1Ifc} S 3333#0 + 4#1 - 6Q #0 #1M FLASH36 8NT M*#0 = 8#1 = 63#2 = 1#3 = 1L U CHAR23L C CASTLE1NB A AUTHORM TURRETfd}CR W1 46 30#1 + 7#2 = 1#3 + 1#0 = 8R W1 146 30#1 + 7#2 = 1#3 + 1#0 = 28R W1 96 30M TURRETCDT AX W1.PGML C Cfe}ASTLE1L X AUTHORQ #0 #1#3 E 1I #2 BY *E#3 E 2I #2 ED CHURNSIDE *E#3 E 3I #2 C. 1986. *E#2 + 1#1 + 6Q #0 #1Id   #0 #1#3 E 1I #2 BY *E#3 E 2I #2 ED CHURNSIDE *E#3 E 3I #2 C. 1986. *E#2 + 1#1 + 6Q #0 #1IhFUUW'U_&U&U%UWUUWUU_UU_UUzWUUUUzz^UUzWUU]UUzz^UUnh}U^gfUUzU UU]UUzU UU^gfUUUUU]UU_ꪪU_ꯪUU^ffUUWUU]Uni}zUU^ffUzUUWUzUWꯪUWUUWUWUꪪUWUWUꪪUWUWnj}UUꪪUWU_UꪪUWUyUꪪUWUUꪪUꪪUzUz ꪪUz nk}Uz UWUUQUWUU@UWUUUWUUUWUU Unl}@UWUUUTUUUUUUUU PAPUUUT @꺪UU@@UPnm} UUQPUP  @UTqPU@꺪3$ U0PU]\\5s5꺪nn}3 0  3  P3 T3 UU@3no}UP3U3UU@3UT3UUUT3E@U3Unp}UU3T UTȨ3 P UT?}@N"@6-@X? A$6-?:<<%@`<,?6-?:<<A<@ ,b3-,6-?:<<>}%<%A($,0 3$SAVE SCREEN TO DISK'6-Av"@#'6-A8@-6-?:<<<,-6-?:<A<<@>} ,< +'0@@@9@@<(>,($CONVERT 08/14/86 (C) 1986>@@>} ( ( (ŠΠϠˠ(  6.SCR A** A*@@4GRAPH>}ICS COMMAND>)()(ŠӠĠٯΩH 6.YN6-?:<,R@A"\#6-@x# @>}A!pf$($(נԠנٯΩp6-?:<,z6-*@# 6-"@#6-&@>}*@ COLORS( (ŠҠӠٯΩ6-?:<,"@xA#((ŠҠ>}ӿ 6.596-?:<,U"@S6-@(*@K6-?:<@<%@<@,U A#76-@>}*@76-?:<@<<@ , SCREEN A 6-?:<<A<@ , 6-?:<<<,$ 6-?:>}<@<<A0,. @$(# INIT2# B<#GG;A0,;Av,;@,;@ ,;@,;@>} ,F#0 6-C:,6-C:,6-C:,'6-C:,06-C:,P#$ N DT1*Ng6-A#;,6-C:,+6-Aa;6. D:DT1.>}OBJJ6-?:<<<,gF:A,@B 4N6-%@6-%A-6-%AC;6-%ApI6-%A`W6->}%Ae6-%As6-%A6-%A>Ns6-%A&6-%A@-6-%AF;6-%ARI6-%A8>}W6-%Are6-%Axs6-%A"6R DT2R[6-A;,6-C:,/6. D1:GF.OBJ>6-?:<<<,[F:A,>}@B Rk 6-6-%@t%6-%AW36-%AA6-%AbO6-%A8]6-%Ak6-%Ax>}S DT3T\6-As;,6-C:,06. D1:GF2.OBJ?6-?:<<<,\F:A,@B T 6-6-%@W$>}U ERRORU(( ĠҠV B  D:CONVERT.BASSECBUPSECPADLMOVSAPBYTSCRBBUFSAVCDT1QLOAQ<Egak haliamg  ,*lonqj'ospt2qurvCRvt xusyoszw {1xv|ov}zT*{y*|y*}y*~y~y*y o oTy0Sm*T** oT:&  oRT&=0SmO{wB@DDwABGDgCBDABBD\*p#) COD BDBD{BDB%kB(O?OO %x`0 3 h ABDqCA D $DDB"DB#DQB$D#oBpBC#qBKrB"DBDCBD3BDCC1DX A DBCD1BDBD2^fed%c2a%`%, MM# B=D%]1~DBD BC3D*BDC6D| 0| 0~X$-D*0 !  wO |&6+0 +; o +"N9A.Gi+O !f "##!$>+%R#&-0C!%(-#" )=!*`%$ +?#,a'& -A%.b)( /C'0c+* 1E)2d-, 3H+4e/. 5J-6f10 7L/8g32 9N1:h54 ;P3<i76 =5>q98 ?C7=Cs;: A9Bt< C;v"E@+F$GB+H&ID+J(KI+L*M)NOW,PK+Q.RM+S0TO+U2VQ+W4X+YS#rTR[US\VS]WS^XS_YS`ZSa[Sb\Sc]Sd^Se_Sf`SgaShbSicSjdSkeSlfSmgSnhSoiSpjSqkSrlSsmStnSuoSvpSwqSxSysRztr{ur|vr}wr~xryrzr{r|r}r~rrrrrrrrRR|%fghiZ ~ * .(   $ CRDSD ,:8s+-+#%{0++ 6 <  /8<++++ +: !$"%#W% &'(DTD+-o/<o12#3'o45C6o7(8o91:=%>?$@A%B:C:D%EFGWHuIJ6BKL M#N! OPPQ2t:FB%DDnB#BB.BTlBU5-t#DAD8MjBC7DDB;DAD  5   5 P 55. r  % #pq t# js uv.w`x!y"z#{$"|"}